package com.example;

import org.junit.Test;

import java.text.*;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAccessor;
import java.util.Calendar;
import java.util.Date;

public class DateTest {
    /* 计算2022年1月25日到2024年5月17日，中间隔了多少天 */
    @Test
    public void test01() {
        Date date1 = new Date(122, 0, 25); // 2022?
        System.out.println(date1);
        Date date2 = new Date(124, 4, 17); // 2024?
        System.out.println(date2);
        long days = (date2.getTime() - date1.getTime()) / (1000 * 60 * 60 * 24);
        System.out.println("2022年1月25日到2024年5月17日，中间隔了" + days + "天。");
        System.out.println("================");
        Calendar calendar = Calendar.getInstance(); //当前时间
        // 指定时间
        calendar.set(2022, 0, 25, 0, 0, 0);
        long start = calendar.getTimeInMillis(); // 时间戳
        calendar.set(2024, 4, 17, 0, 0, 0);
        long end = calendar.getTimeInMillis(); // 结束的时间戳
        days = (end - start) / (1000 * 60 * 60 * 24);
        System.out.println(days);
    }

    /* 300天之后是X年X月X日 */
    @Test
    public void test02() {
        // 通过时间戳 + 300 * 24 * 60 * 60 * 1000
        Date date = new Date();
        // Date date1 = new Date(date.getTime() + 300 * 24 * 60 * 60 * 1000);
        date = new Date(date.getTime() + (1000L * 60 * 60 * 24 * 300));
        System.out.println(date);
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DATE, 300); // calendar往后推300天
        System.out.println(calendar.getTime());
    }

    @Test
    public void test03() {
        // 当前日期
        LocalDate localDate = LocalDate.now();
        System.out.println(localDate);
        // 当前时间
        LocalTime localTime = LocalTime.now();
        System.out.println(localTime);
        // 当前日期时间
        // 第一个时间
        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println(localDateTime);
        // 第二个时间
        LocalDateTime localDateTime1 = LocalDateTime.now();
        localDateTime1 = localDateTime1
                            .withYear(2021)
                            .withMonth(12) // 这里不需要减1
                            .withDayOfMonth(5)
                            .withHour(5)
                            .withMinute(30)
                            .withSecond(52);
        System.out.println(localDateTime1);
        // 2个时间差的对象，小的时间放前面
        Duration duration = Duration
                .between(localDateTime1, localDateTime);
        System.out.println(duration.toDays()); // 天数差
        LocalDate localDate1 = LocalDate.of(2020, 1, 1);
        LocalTime localTime1 = LocalTime.of(1, 1, 1);
        LocalDateTime localDateTime2 = LocalDateTime.of(2020, 1, 1,
                1, 1, 30);
        Period period = Period
                .between(LocalDate.of(2000, 1, 1),
                        LocalDate.now()); // 包含了天数差
        System.out.println("活了" + period.getYears() + "年,"
                +  period.getMonths() + "月"
                + period.getDays() + "天");
    }

    /* 计算还需要多久过100岁生日 */
    @Test
    public void test04() {
        // 1.计算2个时间的时间戳差值，通常只做天数差的运算
        // 2.Period，计算年月日的差值
        // 3.Duration，计算日时分秒的差值
        LocalDate localDate = LocalDate.now();
        LocalDate birthday = LocalDate.of(2000, 1, 1);
        // 计算100岁十日的date对象
        birthday = birthday.withYear(birthday.getYear() + 100);
        Period period = Period.between(localDate, birthday);
        System.out.println("还需要" + period.getYears() + "年,"
                +  period.getMonths() + "月"
                + period.getDays() + "天过100岁生日");
        // localDate是否比birthday早
        System.out.println(localDate.isBefore(birthday)); // true
        System.out.println(localDate.isAfter(birthday)); // false
    }

    /* 2000-01-01 12:00:00 */
    @Test
    public void test05() {
        // 字符串转时间对象
        // 指定转换的格式
        DateTimeFormatter formatter = DateTimeFormatter.
                ofPattern("yyyy-MM-dd HH:mm:ss"); // 标准的自定义格式
        TemporalAccessor parse = formatter
                .parse("2000-01-01 12:00:00");
        LocalDateTime localDateTime = LocalDateTime.from(parse);
        System.out.println(localDateTime);
        formatter = DateTimeFormatter.ofPattern("d/M yy");
        try {
            parse = formatter.parse("29/10 24"); // 可能触发异常
        } catch (Exception e) {
            e.printStackTrace();
        }
        LocalDate localDate = LocalDate.from(parse);
        System.out.println(localDate);
        // 转成Date
        DateFormat dateFormat = new
                SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            Date date = dateFormat.parse("2000-01-01 12:00:00");
            System.out.println(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        Date date = new Date();
        String format = dateFormat.format(date); // 时间转字符串
        System.out.println(format);
    }
}
